import { Injectable } from '@angular/core';
import { HttpService } from './http.service';
import { PageEntity } from './domain/page.entity';
import { Observable } from 'rxjs';
import { Response } from './domain/response';
import * as SockJS from '../../assets/socket/sockjs.min.js';
import { Stomp } from '../../assets/socket/stomp.min.js';

/**
 * @author leihfei
 * @date 2019-04-08
 * @description 公共的HTTP 接口
 */
@Injectable()
export class CommHttpService {
  protected PRE_URL = '';
  stompClientArr: any = [];

  constructor(protected http: HttpService) {
  }

  /**
   * 分页查询
   * @param page 分页参数
   */
  page(page: PageEntity): Observable<Response> {
    return this.http.post(page, `${this.PRE_URL}page`);
  }

  /**
   * 查询单条数据
   * @param ids id
   */
  view(ids: string): Observable<Response> {
    return this.http.post({id: ids}, `${this.PRE_URL}view`);
  }

  /**
   * 更新数据
   * @param data 参数
   */
  update(data: any): Observable<Response> {
    return this.http.post(data, `${this.PRE_URL}update`);
  }

  /**
   * 通过id删除数据
   * @param ids 待删除数据
   */
  delete(ids: string): Observable<Response> {
    return this.http.post({id: ids}, `${this.PRE_URL}delete`);
  }

  /**
   * 通过id列表删除数据
   * @param ids id列表
   */
  deleteAll(ids: string[]): Observable<Response> {
    return this.http.post(ids, `${this.PRE_URL}deleteAll`);
  }

  /**
   *  新增数据
   * @param data 待新增数据
   */
  create(data: any): Observable<Response> {
    return this.http.post(data, `${this.PRE_URL}create`);
  }

  /**
   * 查询列表数据
   * @param data 参数
   */
  list(data: any = {}): Observable<Response> {
    return this.http.post(data, `${this.PRE_URL}list`);
  }

  protected get preUrl(): string {
    return this.PRE_URL;
  }

  protected set preUrl(value: string) {
    this.PRE_URL = value;
  }


  /**
   * @method getBySocket 通过Http获取数据
   * @param modelUrl 建立socket主机地址
   * @param url 建立socket模块地址
   * @param callback 数据回调函数
   */
  getBySocket(modelUrl, url, callback) {
    const that = this;
    // 创建websocket连接对象
    const socket = new SockJS(modelUrl);
    const stompClients = Stomp.over(socket);
    // 向后台发出连接信息
    stompClients.connect({}, (frame) => {
      // 连接成功保存连接成功后的stompClient对象，用于后续主动关闭websocket
      that.stompClientArr.push({
        // 服务类地址
        classUrl: url,
        // 服务建立成功后说得建立对性
        stompClient: stompClients
      });
      // 建立数据推送与解析
      stompClients.subscribe(url, (message) => {
        const info = JSON.parse(message.body);
        // 回调数据对象
        callback(info);
      });
    });
  }

  /**
   * @method offSocket 关闭websocket
   * @param classUrl 模块地址
   * @author 周贞荣
   */
  toffSocke(classUrl) {
    // 存儲需要保留的socket
    const indexList = [];
    // 對已建立的鏈接訓話
    this.stompClientArr.forEach((item) => {
      // 初始為關閉這條socket
      let off = true;
      classUrl.forEach(itema => {
        // 如果查詢到這個socket在保留列表中保留他
        if (item.classUrl === itema || item.classUrl === itema + '') {
          off = false;
          indexList.push(item);
        }
      });
      if (off) {
        // 不在需要保留的列表中，關閉
        item.stompClient.disconnect();
      }
    });
    // 更新socket列表
    this.stompClientArr = indexList;
  }

}
